package com.dp.client.views.conexiones;

import java.util.List;

import backend.estructuras.common.Conexion;
import backend.estructuras.common.Vuelo;

import com.dp.client.dto.AlmacenDTO;
import com.dp.client.dto.ConexionDTO;
import com.dp.client.servicios.almacenes.IServiciosAlmacen;
import com.dp.client.servicios.almacenes.IServiciosAlmacenAsync;
import com.dp.client.servicios.conexion.IServiciosConexion;
import com.dp.client.servicios.conexion.IServiciosConexionAsync;
import com.dp.client.util.Alerts;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.IntegerBox;

public class ConexionesPrincipal extends Composite {
	private Button btnBuscar ;
	private ListBox cboxOrigen, cboxDestino;
	String days = "LMMJVSD";
	CheckBox [] checkDays = new CheckBox [ 7 ];
	IServiciosConexionAsync serviciosConexion = GWT.create(IServiciosConexion.class);
	private Label lblCapacidadMinima;
	private Label lblDescripcion , lblError;
	private Label lblCapacidadMaxima;
	private TablaConexiones tablaDatos;
	private String errorMsg;
	List< AlmacenDTO > almacenes;
	private Button btnCrearNuevo;
	private Button btnRefrescar;
	private Label lblHoraSalidaMinima;
	private Label lblHoraSalidaMaxima;
	private IntegerBox intBoxCapacidadMinima;
	private IntegerBox intBoxCapacidadMaxima;
	private IntegerBox intBoxHoraMinima;
	private IntegerBox intBoxHoraMaxima;
	
	public void cargarCombo( ListBox combo ){
		combo.addItem( "Seleccione" , "-1" );	
		for( AlmacenDTO almacen : almacenes ){
			combo.addItem( almacen.getCiudad().getNombre() , almacen.getId()+"" );
		}
	}
	
	public void loadData(){
		IServiciosAlmacenAsync serviciosAlmacen = GWT.create(IServiciosAlmacen.class);
		cboxDestino.addItem( "Seleccione" , ".");
		cboxOrigen.addItem( "Seleccione" , ".");
		serviciosAlmacen.listAlmacenes(new AsyncCallback<List<AlmacenDTO>>(){
			public void onSuccess(List <AlmacenDTO> result){
				almacenes = result;
				cboxDestino.clear();
				cboxOrigen.clear();
				cargarCombo( cboxDestino );
				cargarCombo( cboxOrigen );
			}

			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
	}
	public ConexionesPrincipal() {

		
		CaptionPanel upperPanel = new CaptionPanel();
		upperPanel.setCaptionText("Conexiones");
		
		initWidget(upperPanel);
		upperPanel.setSize("auto", "auto");
		VerticalPanel verticalPanel = new VerticalPanel();
		upperPanel.add(verticalPanel);
		
		HorizontalPanel horizontalPanel = new HorizontalPanel();
		verticalPanel.add(horizontalPanel);
		
		FlexTable flexTable = new FlexTable();
		horizontalPanel.add(flexTable);
		flexTable.setWidth("666px");
		
		lblDescripcion = new Label("Almacen Origen:");
		flexTable.setWidget(0, 0, lblDescripcion);
		
		cboxOrigen = new ListBox();
		flexTable.setWidget(0, 1, cboxOrigen);
		
		Label lblAlmacenDestino = new Label("Almacen Destino:");
		flexTable.setWidget(0, 4, lblAlmacenDestino);
		
		cboxDestino = new ListBox();
		flexTable.setWidget(0, 5, cboxDestino);
		
		lblCapacidadMinima = new Label("Capacidad Minima:");
		lblCapacidadMinima.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);
		flexTable.setWidget(1, 0, lblCapacidadMinima);
		
		intBoxCapacidadMinima = new IntegerBox();
		flexTable.setWidget(1, 1, intBoxCapacidadMinima);
		
		lblCapacidadMaxima = new Label("Capacidad Maxima:");
		flexTable.setWidget(1, 4, lblCapacidadMaxima);
		flexTable.getCellFormatter().setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_LEFT);
		
		tablaDatos = new TablaConexiones(this);
		verticalPanel.add( tablaDatos );
		
		btnBuscar = new Button("Buscar");
	
		btnBuscar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if( validQuery() ){
					do_query();
				} else {
					Alerts.crearAlerta(errorMsg);
				} 
			}
		});
		
		intBoxCapacidadMaxima = new IntegerBox();
		flexTable.setWidget(1, 5, intBoxCapacidadMaxima);
		
		lblHoraSalidaMinima = new Label("Hora Salida Minima:");
		flexTable.setWidget(2, 0, lblHoraSalidaMinima);
		
		intBoxHoraMinima = new IntegerBox();
		flexTable.setWidget(2, 1, intBoxHoraMinima);
		
		lblHoraSalidaMaxima = new Label("Hora Salida Maxima:");
		flexTable.setWidget(2, 4, lblHoraSalidaMaxima);
		
		intBoxHoraMaxima = new IntegerBox();
		flexTable.setWidget(2, 5, intBoxHoraMaxima);
		
		HorizontalPanel vPanelDias = new HorizontalPanel();
		flexTable.setWidget(3, 1, vPanelDias);
		for( int i = 0 ; i < 7 ; i++ ){
			checkDays[ i ] = new CheckBox( "" );
			checkDays[ i ].setValue( true );
		}
		for( int i =0 ; i < 7 ; i++ ){
			vPanelDias.add( new Label( "" + days.charAt( i ) )  );
			vPanelDias.add( checkDays[ i ] );
		}
		lblError = new Label("");
		lblError.setVisible(false);
		flexTable.setWidget(3, 4, lblError);
		flexTable.setWidget(4, 0, btnBuscar);
		
		btnCrearNuevo = new Button("Crear Nuevo");
		flexTable.setWidget(4, 1, btnCrearNuevo);
		
		btnCrearNuevo.addClickHandler( new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				abrirDialogConexionNueva();
			}
		});
		
		btnRefrescar = new Button("New button");
		btnRefrescar.setText("Refrescar");
		flexTable.setWidget(4, 2, btnRefrescar);
		
		btnRefrescar.addClickHandler( new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				refrescar();
			}
		});
		loadData();
		do_query();

	}

	public AlmacenDTO getAlmacen(int idOrigen) {
		// TODO Auto-generated method stub
		for( AlmacenDTO a : almacenes ) if( a.getId() == idOrigen ){
			return a;
		}
		return null;
	}
	
	void do_query(){
		System.out.println("valid");
		if( ! validQuery() ) return;
		int idSelOr = cboxOrigen.getSelectedIndex();
		String idOr = idSelOr == -1 ? "" : cboxOrigen.getValue( idSelOr ) + "";
		int idSelDe = cboxDestino.getSelectedIndex();
		String idDe = idSelDe == -1 ? "" : cboxOrigen.getValue( idSelDe ) + "";
		StringBuilder build = new StringBuilder();
		for( CheckBox cbx : checkDays ) build.append( cbx.getValue() ? "1" : "0" );
		String cmax = intBoxCapacidadMaxima.getText().compareTo( "" ) == 0 ? "" : intBoxCapacidadMaxima.getText();
		String cmin = intBoxCapacidadMinima.getText().compareTo( "" ) == 0 ? "" : intBoxCapacidadMinima.getText();
		String horama = intBoxHoraMaxima.getText().compareTo( "" ) == 0 ? "" : intBoxHoraMaxima.getText();
		String horami = intBoxHoraMinima.getText().compareTo( "" ) == 0 ? "" : intBoxHoraMinima.getText();
		serviciosConexion.getConexiones( cmax , 
				cmin , idOr , idDe , 
				horama, horami , build.toString() , new AsyncCallback<List<ConexionDTO>>() {
			
			@Override
			public void onSuccess(List<ConexionDTO> result) {
				tablaDatos.setData( result );
			}
			
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
	}
	
	boolean validQuery(){
		errorMsg = "ingrese datos validos";
		if( intBoxCapacidadMaxima.getValue() == null && intBoxCapacidadMaxima.getText().compareTo("") != 0 ) return false;
		if( intBoxCapacidadMinima.getValue() == null && intBoxCapacidadMinima.getText().compareTo( "") != 0  ) return false;
		if( intBoxHoraMaxima.getValue() == null && intBoxHoraMaxima.getText().compareTo("") != 0 ) return false;
		if( intBoxHoraMinima.getValue() == null && intBoxHoraMinima.getText().compareTo("") != 0 ) return false;
		if( cboxDestino.getSelectedIndex() < 0 ) return false;
		if( cboxOrigen.getSelectedIndex() < 0 ) return false;
		return true;
	}
	
	void refrescar(){
		loadData();
		do_query();
	}
	
	void abrirDialogConexionNueva(){
		ConexionesDialog dialog = new ConexionesDialog( null , this );
		dialog.addCloseHandler( new CloseHandler<PopupPanel>() {
			
			@Override
			public void onClose(CloseEvent<PopupPanel> event) {
				do_query();
			}
		});
		dialog.center();
		dialog.show();
	}

	public void modificar( ConexionDTO object ){
		ConexionesDialog dialog = new ConexionesDialog( object , this );
		dialog.addCloseHandler( new CloseHandler<PopupPanel>() {
			
			@Override
			public void onClose(CloseEvent<PopupPanel> event) {
				do_query();
			}
		});
		dialog.center();
		dialog.show();
	}
	public int getidAlmacen(int id ) {
		for( int i = 0 ; i < almacenes.size() ; i++ ) if( almacenes.get( i ).getId()== id ){ 
			return 1 + i;
		} 
		return 0;
	}

	public void dialogVuelo( ConexionDTO conexion ){
		VuelosDialog vuelo = new VuelosDialog(conexion);
		vuelo.addCloseHandler( new CloseHandler<PopupPanel>() {
			
			@Override
			public void onClose(CloseEvent<PopupPanel> event) {
				do_query();
			}
		});
		vuelo.center(); 
		vuelo.show();
	}
	public void eliminar(ConexionDTO object) {
		serviciosConexion.borrarConexion(object, new AsyncCallback<Boolean>() {
			
			@Override
			public void onSuccess(Boolean result) {
				Alerts.dialogExitoEliminacionDeObjeto( "conexion" );
				refrescar();
			}
			
			@Override
			public void onFailure(Throwable caught) {
				// TODO Auto-generated method stub
				Alerts.dialogErrorConexion();
			}
		});
	}
}
